package cn.xyy.common.table;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import cn.xyy.bcode.domain.MonthBills;

public class MonthBillsTableUtil {

	private static ThreadLocal<SimpleDateFormat> monthTL = ThreadLocal
			.withInitial(() -> new SimpleDateFormat("YYYYMM"));

	// 表的前缀
	private static String tablePrefix = "t_month_bills_";

	// 将一个日期格式化为YYYYMM格式
	public static String getYearMonth(Date date) {
		return monthTL.get().format(date);
	}

	// 获取目标数据的表名（操作单条数据公用的方法：增删改查）
	public static void getTableByDate(MonthBills monthBills) {
		// 获取传入对象的时间
		Date billDate = monthBills.getBillDate();
		// 根据该对象中的时间，计算出要操作的表名后缀
		String yearMonth = getYearMonth(billDate);
		// 将表前缀和后缀拼接，得到完整的表名，如：t_month_bills_202211
		monthBills.setTargetTable(tablePrefix + yearMonth);
	}

	// 根据流水号得到表名
	public static void getTableBySerialNumber(MonthBills monthBills) {
		// 获取流水号的后13位（时间戳）
		String timeMillis = monthBills.getSerialNumber().substring(monthBills.getSerialNumber().length() - 13);
		// 将字符串类型的时间戳转换为long类型
		long millis = Long.parseLong(timeMillis);
		// 调用getYearMonth()方法获取时间戳中的年月
		String yearMonth = getYearMonth(new Date(millis));
		// 用表的前缀名拼接年月，得到最终要操作的表名
		monthBills.setTargetTable(tablePrefix + yearMonth);
	}

	// 获取按时间范围查询时，两个日期之间，所有月份账单表的表名
	public static List<String> getTablesByRangeQuery(String startTime, String endTime) {
		// 声明一个日期格式化类
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		// 声明保存表名的集合
		List<String> tables = new ArrayList<>();
		try {
			// 将两个传入的字符日期转换成日期类型
			Date startDate = sdf.parse(startTime);
			Date endDate = sdf.parse(endTime);

			// 用 Calendar 进行日期比较判断
			Calendar calendar = Calendar.getInstance();
			while (startDate.getTime() <= endDate.getTime()) {
				// 把生成的月份拼接表前缀名，加入到集合中
				tables.add(tablePrefix + monthTL.get().format(startDate));
				// 设置日期，并把比对器的日期增加一月
				calendar.setTime(startDate);
				calendar.add(Calendar.MONTH, 1);
				// 获取增加后的日期
				startDate = calendar.getTime();
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		// 返回两个日期之间的所有表名
		return tables;
	}

}
